import os
import json
import frappe
from frappe.model.document import Document

class AC_BalanceSheet_Config(Document):
    @frappe.whitelist()
    def import_example_data(self):
        """从JSON文件导入示例数据并替换公司简称"""
        try:
            # 根据version值选择不同的JSON文件
            if self.version == "SMES":
                file_name = "AC_BalanceSheet_Config_SMES.json"
            elif self.version == "NORM":
                file_name = "AC_BalanceSheet_Config_NORM.json"
            else:
                frappe.throw("无效的版本值，请选择 SMES 或 NORM")

            # 读取JSON文件
            file_path = os.path.join(os.path.dirname(__file__), file_name)
            with open(file_path, "r", encoding="utf-8") as f:
                data = json.load(f)
            
            # 清空现有子表数据
            self.items = []
            
            # 检查公司是否存在
            if not self.company:
                frappe.throw("请先选择公司")
            
            # 获取公司简称
            company = frappe.get_doc("Company", self.company)
            company_abbr = company.abbr if hasattr(company, "abbr") else company.name[:2]
            
            # 检查JSON数据结构
            config_items = data.get("AC_BalanceSheet_Config_Item", [])
            if not isinstance(config_items, list) or not config_items:
                frappe.throw("JSON格式错误：未找到配置项列表")
            
            # 验证必填字段并导入数据
            required_fields = {
                "报表项目": "rpt_item",
                "来源科目": "acct",
                "系数": "rate"
            }
            
            for idx, item_data in enumerate(config_items):
                row_num = idx + 1
                
                # 验证必填字段
                for json_field, table_field in required_fields.items():
                    value = item_data.get(json_field)
                    if value is None or not str(value).strip():
                        frappe.throw(f"第 {row_num} 行的 {json_field} 字段不能为空")
                
                # 替换[ABBR]为公司简称
                acct = item_data.get("来源科目", "").replace("[ABBR]", company_abbr)
                
                # 映射数据到子表
                self.append("items", {
                    "rpt_item": item_data.get("报表项目"),
                    "acct": acct,
                    "rate": int(item_data.get("系数", 1)),
                    "sort_id": int(item_data.get("序号", 0))
                })
            
            self.save()
            frappe.msgprint("示例数据已成功导入并替换公司简称")
            
        except FileNotFoundError:
            frappe.throw("未找到示例配置文件")
        except frappe.DoesNotExistError as e:
            frappe.throw(f"公司不存在：{str(e)}")
        except json.JSONDecodeError:
            frappe.throw("JSON解析失败，请检查文件格式")
        except Exception as e:
            frappe.log_error(f"导入失败: {str(e)}")
            frappe.throw(f"导入失败: {str(e)}")
    
@frappe.whitelist()
def validate(self):
    """验证主表数据"""
    if not self.company:
        frappe.throw("公司字段不能为空")
        
    # 验证子表数据
    if not self.items:
        frappe.throw("至少需要添加一个报表项目配置")

@frappe.whitelist()
def import_balance_sheet_config(company_name, json_data):
    """
    从JSON数据导入资产负债表配置
    
    :param company_name: 公司名称
    :param json_data: JSON格式的配置数据
    :return: 导入结果
    """
    try:
        if not company_name or not json_data:
            frappe.throw("缺少必要参数：公司名称或JSON数据")
        
        # 解析JSON数据
        data = json.loads(json_data)
        config_items = data.get("AC_BalanceSheet_Config_Item", [])
        
        if not isinstance(config_items, list) or len(config_items) == 0:
            frappe.throw("无效的JSON数据格式：未找到配置项列表")
        
        # 创建新的配置文档
        config = frappe.new_doc('AC_BalanceSheet_Config')
        config.company = company_name
        config.imported_from_json = 1  # 标记为从JSON导入
        
        # 映射并添加子表项
        for idx, item_data in enumerate(config_items):
            row_num = idx + 1
            
            # 验证必填字段
            for json_field, table_field in {
                "报表项目": "rpt_item",
                "来源科目": "acct",
                "系数": "rate"
            }.items():
                if json_field not in item_data or not str(item_data.get(json_field)).strip():
                    frappe.throw(f"第 {row_num} 行的 {json_field} 字段不能为空")
            
            # 添加子表项
            item = config.append('items', {})
            item.rpt_item = item_data.get('报表项目')
            item.acct = item_data.get('来源科目')
            item.rate = int(item_data.get('系数', 1))
            item.sort_id = int(item_data.get('序号', 0))
        
        # 保存文档
        config.save(ignore_permissions=True)
        frappe.db.commit()
        
        return {
            'success': True,
            'message': '资产负债表配置导入成功',
            'config_name': config.name
        }
    
    except json.JSONDecodeError:
        frappe.throw("JSON数据解析失败，请检查数据格式")
    except Exception as e:
        frappe.log_error(f"导入资产负债表配置失败: {str(e)}")
        frappe.throw(f"导入失败: {str(e)}")